﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using OwnZTec.LojaDelivery.Data;
using Telerik.WinControls.UI;

namespace OwnZTec.LojaDelivery.UI.WinForms
{
    public partial class FrmGruposProdutosCliente : OwnZForm
    {
        #region -- Membros e Construtores -------------------------------------------------------------------------------------------------
        private bool _alterado;

        private bool carregado;

        private int _cliente;

        public FrmGruposProdutosCliente()
        {
            InitializeComponent();
            this.ConfigurarFormFilho();
        }

        private void FrmGruposProdutosCliente_Load(object sender, EventArgs e)
        {
            carregado = false;
            cmbCliente.DataSource = Contexto.Db.tbClientes.ToList();
            cmbCliente.DisplayMember = "desCliente";
            cmbCliente.ValueMember = "idCliente";
            cmbCliente.DropDownListElement.AutoCompleteSuggest.SuggestMode = SuggestMode.Contains;

            cmbCliente.SelectedIndex = 0;

            _cliente = cmbCliente.SelectedValue.ParaInt();

            AtualizarGrid();

            Contexto.MainForm.Cursor = Cursors.Arrow;

            _alterado = false;
            carregado = true;
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Eventos ----------------------------------------------------------------------------------------------------------------


        private void gvGruposProdutos_CellValidating(object sender, Telerik.WinControls.UI.CellValidatingEventArgs e)
        {
            if (e.Column.Name == "ValorCliente" && e.OldValue.ParaDecimal() != e.Value.ParaDecimal())
                _alterado = true;
        }

        private void cmdSalvar_Click(object sender, EventArgs e)
        {
            Salvar();
            Close();
        }

        private void cmdSalvareContinuar_Click(object sender, EventArgs e)
        {
            Salvar();
        }

        private void cmdSair_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void FrmGruposProdutosCliente_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!_alterado)
                return;

            var res = Contexto.MainForm.ExibirMensagemSairSemSalvar();

            if (res != DialogResult.Yes)
            {
                e.Cancel = true;
                return;
            }

            Dispose();
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Metodos ----------------------------------------------------------------------------------------------------------------
        private void AtualizarGrid()
        {
            if (_alterado)
                return;

            Cursor = Cursors.WaitCursor;

            var lGrupos = new List<RecGrupoProdutoCliente>();

            Contexto.Db.tbGrupoProdutoes.ToList().ForEach(gp => lGrupos.Add(new RecGrupoProdutoCliente
            {
                IdGrupo = gp.idGrupo,
                IdCliente = _cliente,
                DesNome = gp.desNomeGrupo,
                Valor = gp.valPrecoPadrao
            }));

            var lgpc = Contexto.Db.tbGrupoProdutoClientes.Where(gpc => gpc.idCliente == _cliente);

            if (lgpc.Count() != 0)
            {
                lgpc.ToList().ForEach(gpc =>
                {
                    var gp = lGrupos.First(rgp => rgp.IdGrupo == gpc.idGrupoProduto);

                    gp.ValorCliente = gpc.valPrecoGrupoProdutoCliente;
                    gp.IdCliente = gpc.idCliente;
                });
            }

            gvGruposProdutos.DataSource = lGrupos;

            Cursor = Cursors.Arrow;
        }

        public void Salvar()
        {
            var lGrupos = (List<RecGrupoProdutoCliente>)gvGruposProdutos.DataSource;

            lGrupos.Where(g => g.ValorCliente == 0).ToList().ForEach(rgc =>
            {
                var gc = Contexto.Db.tbGrupoProdutoClientes.
                        FirstOrDefault(tgc => tgc.idCliente == rgc.IdCliente && tgc.idGrupoProduto == rgc.IdGrupo);

                if (gc != null)
                    Contexto.Db.tbGrupoProdutoClientes.DeleteObject(gc);
            });

            lGrupos.Where(g => g.ValorCliente != 0).ToList().ForEach(rgc =>
            {
                var gc = Contexto.Db.tbGrupoProdutoClientes.
                        FirstOrDefault(tgc => tgc.idCliente == rgc.IdCliente && tgc.idGrupoProduto == rgc.IdGrupo);

                if (gc == null)
                {
                    gc = new tbGrupoProdutoCliente
                       {
                           idCliente = rgc.IdCliente,
                           idGrupoProduto = rgc.IdGrupo
                       };

                    Contexto.Db.tbGrupoProdutoClientes.AddObject(gc);
                }

                gc.valPrecoGrupoProdutoCliente = rgc.ValorCliente;
            });

            Contexto.Db.SaveChanges();

            _alterado = false;
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        private void cmbCliente_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
        {
            if (!carregado)
                return;
            if (_cliente == cmbCliente.SelectedValue.ParaInt())
                return;

            if (_alterado)
            {
                var res = Contexto.MainForm.ExibirMensagem("Os valores alterados serão perdidos, deseja continuar sem salvar?",
                                                 MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (res == DialogResult.Yes)
                    _alterado = false;
                else
                    cmbCliente.SelectedValue = _cliente;
            }

            _cliente = cmbCliente.SelectedValue.ParaInt();

            AtualizarGrid();
        }


    }
}
